#!/usr/bin/python3
# _*_ coding: utf-8 _*_
#
# Copyright (C) 2022 - 2022 heihieyouheihei, Inc. All Rights Reserved 
#
# @Time    : 2022/11/21 21:53
# @Author  : heihieyouheihei
# @File    : base_grammar_14.py
# @IDE     : PyCharm
# 位运算符
# 把数字看做二进制数来进行计算的, 因此要把执行的数据转换为二进制数字, 然后再进行运算
# Python 中主要有6种运算符, 位与&, 位或|, 位取反~, 位异或^, 左位移<<, 右位移>>
# 位与&:  有0即为0, 两个二进制数进行位与运算的时候, 只要有一个相应的位上有0, 这个结果就是0
# 位或|:  有1即为1, 当两个二进制数进行位或运算的时候, 只要相应的位上有1, 位或的结果就是1
# 位取反~:  把0变成1, 把1变成0
# 位异或^:  两个二进制数的相应位, 只有全是0, 或者全是1时, 这个结果才是0, 否则这个结果是1, 也就是说,在相应的位上两个数不相同, 它的结果才是1,相同结果为0
# 左移位<<: 用来把一个二进制操作数向左移动指定的位数, 左边的位丢弃, 右边空出的用0补齐, 相当于乘以2的n此幂
# 右移位>>: 用来把一个二进制操作数向右移动指定的位数, 右边的位丢弃, 左边空出的,如果最高位是1则补充1; 如果最高位是0则补充0, 相当于除以2的n此幂

# 位与运算  十进制12和8进制位运算
#   0000 0000 0000 1100
# & 0000 0000 0000 1000
#   0000 0000 0000 1000

# 位或运算  十进制4和8进制位运算
#   0000 0000 0000 0000 1100
# | 0000 0000 0000 0000 1000
#   0000 0000 0000 0000 1100

# 位异或运算  十进制31和22进制位运算(位异或运算的结果为9)
#   0000 0000 0000 0001 1111
# ^ 0000 0000 0000 0001 0110
#   0000 0000 0000 0000 1001

# 位取反运算  十进制123进行位取反运算(位取反运算的结果为-124)
# ~ 0000 0000 0111 1011
#   1111 1111 1000 0100 (二进制数的第一个数字表示符号位,0表示正数,1表示负数)

# 加密运算
pwd = input("请输入密码: ")
print("原密码: ", pwd)
key = input("请输入秘钥: ")
password = int(pwd) ^ int(key)
print("加密后: ",password)
# 对加密运算进行解密
print("解密后: ",password ^ int(key))

# 左移位<<: 对于一个10进制的数48进行左移位
# 00110000  (首先转化成二进制, 左移1位操作)
# 01100000  (最右边的0是补进来的, 对应的数是96) 96 = 48*2
# 11000000  (对上面的数再左移一位, 最右边的0是补进来的, 低位补0高位的0被舍弃, 对应的数是 192) 192 =48*2^2

# 右移位<<: 对于一个10进制的数48进行右移位   右移运算相当于除以2的n次幂
# 00110000  (首先转化成二进制, 右移1位操作)
# 00011000  (原来最有段的0会被舍去, 由于它的最高位也就是最左边的是0也就是正数最左边补一个0, 对应的数是24) 24 = 48/2

# 右移位<<: 对一个负数进行右移两位操作(十进制-80)  右移运算相当于除以2的n次幂
# 10110000  (首先把十进制的-80转化为二进制的数)
# 11101100  (最右边的两个0被移除, 在左侧补位的时候原来左边最高位是1,表示负数, 就补两个1, 转化之后的数是-20) -20 = -80/2^2

# 在开发的时候, 如果乘以或者除以2的n次幂的时候可以进行左移或者右移运算
number1 = 32
print("左移一位: ",number1 << 1) # 左移一位就是乘以2的1次幂, 32*2 = 64
math1 = 128
print("右移一位:", math1 >>1 ) # 右移一位就是除以2的1次幂, 128/2 = 64
math2 = -128123
print("负数右移一位: ", math2 >> 1) # 右移一位就是除以2的1次幂, -128/2 = -64